from abc import ABC
from dataclasses import dataclass

@dataclass
class Satphone(ABC):
    __name:str
    __satelite:str

    @property
    def name(self):
        return self.__name

    @name.setter
    def name(self,value):
        self.__name=value

    @property
    def satelite(self):
        return self.__satelite

    @satelite.setter
    def satelite(self,value):
        self.__satelite=value

    def message(self,m):
        print(f'{self.name}使用{self.satelite}卫星线路发送信息:{m}')

    def call(self):
        print(f'{self.name}使用{self.satelite}卫星线路拨打|接收电话')

    def _toCoordinates(self,complex):
        return f'{"东" if complex.real >=0 else "西"}经{abs(complex.real)}°,\{"北" if complex.imag>= 0 else "南"}纬{abs(complex.imag)}"'.replace(" ","")

    def lbs(self,coordinates):
        print(f'{self.name}使用{self.satelite}卫星定位:{self._toCoordinates(coordinates)}')


class Huawei(Satphone):
    def __init__(self):
        super().__init__("华为","北斗+天通")

    def message(self,m):
        print(f'修改后的{self.name}使用{self.satelite}卫星线路发送信息:{m}')
        super().message(m)

    def call(self):
        print(f'修改后的{self.name}使用{self.satelite}卫星线路拨打|接收电话')
        super().call()
    def lbs(self,coordinates):
        print(f'修改后的{self.name}使用{self.satelite}卫星定位:{self._toCoordinates(coordinates)}')
        super().lbs(coordinates)

def satphone(phone,coordinates):
    print(f'{phone}是一个卫星电话？{isinstance(phone,Satphone)}')
    phone.message("5G没信号了，我还有信号！")
    phone.call()
    phone.lbs(coordinates)

satphone(Huawei(),180+90j)

#修改了子类中的多个方法，最终调用satphone函数时，会调用子类中修改过的方法
#如果在子类的方法中想要调用父类的同名方法，可以使用super()函数来实现